home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / latex209 / contrib / textyl / psrc / textyl.pas.ah < prev    next >
Text File  |  1993-11-07  |  27KB  |  874 lines

  1.  
  2.      strcopy (dvifname.str, logfilnam.str, dvifname.len);
  3.      logfilnam.len := dvifname.len;
  4.      rp := revindex (logfilnam, '.');
  5.      (* add a ".tlog" extension *)
  6.      i := rp - 1;
  7.      logfilnam.str[i + 1] := '.';
  8.      logfilnam.str[i + 2] := 't';
  9.      logfilnam.str[i + 3] := 'l';
  10.      logfilnam.str[i + 4] := 'o';
  11.      logfilnam.str[i + 5] := 'g';
  12.      logfilnam.len := i + 5;
  13.  
  14.      openlogfile;
  15. end; 
  16.  
  17.  
  18. {-----------------------------------------------------}
  19.     function inTFM (z: integer): boolean;
  20.     label
  21.         9997, 9998, 9999;
  22.     var
  23.         k: integer;
  24.         lh: integer;
  25.         nw: integer;
  26.         alpha, beta: integer; 
  27.     begin
  28.         readtfmword;
  29.         lh := b2 * 256 + b3;
  30.         readtfmword;
  31.         font[nf].bc := b0 * 256 + b1;
  32.         font[nf].ec := b2 * 256 + b3;
  33.         if (font[nf].ec < font[nf].bc) then 
  34.             font[nf].bc := font[nf].ec + 1;
  35.         readtfmword;
  36.         nw := b0 * 256 + b1;
  37.         if ((nw = 0) or (nw > 256)) then 
  38.             goto 9997;
  39.         for k := 1 to 3 + lh do 
  40.           begin
  41.             if eof(tfmfile) then 
  42.                 goto 9997;
  43.             readtfmword;
  44.             if (k = 4) then 
  45.               if (b0 < 128) then 
  46.                 tfmchecksum := ((b0 * 256 + b1) * 256 + b2) * 256 + b3
  47.               else 
  48.                 tfmchecksum := (((b0 - 256) * 256 + b1) * 256 + b2) * 256 + b3
  49.           end; 
  50.           
  51.             for k := 0 to (font[nf].ec - font[nf].bc) do
  52.               begin
  53.                 readtfmword;
  54.                 if (b0 > nw) then 
  55.                     goto 9997;
  56.                 font[nf].widths[k] := b0
  57.               end; 
  58.           alpha := 16 * z;
  59.           beta := 16;
  60.           while z >= TWO23 do
  61.             begin
  62.               z := z div 2;
  63.               beta := beta div 2
  64.             end;
  65.         for k := 0 to nw - 1 do
  66.           begin
  67.             readtfmword;
  68.             inwidth[k] := (((b3 * z) div 256 + b2 * z) div 256 + b1 * z) div beta;
  69.             if b0 > 0 then 
  70.                 if b0 < 255 then 
  71.                     goto 9997
  72.                 else 
  73.                     inwidth[k] := inwidth[k] - alpha;
  74.           end;
  75.         if inwidth[0] <> 0 then 
  76.             goto 9997;
  77.         with font[nf] do
  78.           begin
  79.           for k := 0 to (ec - bc) do 
  80.             if widths[k] = 0 then
  81.               begin
  82.               widths[k + bc] := TWO31;
  83. {              pixelwidths[k + bc] := 0;}
  84.               end
  85.             else
  86.               begin
  87.               widths[k + bc] := inwidth[widths[k]];
  88. {              pixelwidths[k + bc] := round(conv * widths[k]);}
  89.               end;
  90.            end; (* with *)
  91.         inTFM := true;
  92.         goto 9999;
  93. 9997:
  94.     complain (ERRREALBAD);
  95.         writestrng(tfmname,true);
  96.     writeln(logfile,'---not loaded, TFM file is bad');
  97.           
  98. 9998:
  99.         inTFM := false;
  100. 9999:
  101.         
  102.     end; 
  103.  
  104.  
  105.  
  106. {-----------------------------------------------------}
  107. procedure Fastdefinefont (fn: integer);
  108. var     p, k: integer;
  109.         n, waste: integer;
  110.         c, q, d: integer;
  111.  
  112. begin  { Fastdefinefont }
  113.   c := Dsign4byte;
  114.   q := Dsign4byte;
  115.   d := Dsign4byte;
  116.   p := Dget1byte;
  117.   n := Dget1byte;
  118.   for k := 1 to (p + n) do
  119.     waste := Dget1byte;                         
  120. end;  { Fastdefinefont }
  121.  
  122.  
  123. {-----------------------------------------------------}
  124.     procedure definefont (e: integer);
  125.     var
  126.         f: 0..MAXFONTS;
  127.         p, k: integer;
  128.         n: integer;
  129.         c, q, d: integer;
  130.         r: integer;
  131.     begin
  132.         if (nf = MAXFONTS) then 
  133.         begin
  134.       complain (ERRREALBAD);
  135.           writeln(logfile,'TeXtyl capacity exceeded (max fonts=', MAXFONTS: 1, ')!');
  136.           writeln('TeXtyl capacity exceeded (max fonts=', MAXFONTS: 1, ')!');
  137.           jumpout
  138.         end;
  139.         font[nf].num := e;
  140.         f := 0;
  141.         while font[f].num <> e do  (* find first occurrence *)
  142.             f := f + 1; 
  143.         c := Dsign4byte;
  144.         font[nf].checksum := c;
  145.         q := Dsign4byte;
  146.         font[nf].scaledsize := q;
  147.         d := Dsign4byte;
  148.         font[nf].designsize := d;
  149.         p := Dget1byte;
  150.         n := Dget1byte;
  151.         font[nf].name.len := p + n;
  152.         for k := 1 to (p + n) do
  153.            font[nf].name.str[k] := Dget1byte;
  154.  
  155.         if (f = nf) then 
  156.         begin (* f = nf *)
  157.             for k := 1 to AREALENGTH do 
  158.                 tfmname.str[k] := ' ';
  159.  
  160.               r := 0;
  161.             
  162.             for k := 1 to font[nf].name.len do 
  163.               begin
  164.                 r := r + 1;
  165.                 tfmname.str[r] := xchr[font[nf].name.str[k]]
  166.               end;
  167.             tfmname.str[r + 1] := '.';
  168.             tfmname.str[r + 2] := 't';
  169.             tfmname.str[r + 3] := 'f';
  170.             tfmname.str[r + 4] := 'm';
  171.  
  172.         tfmname.str[r + 5] := chr(32);
  173.  
  174.         tfmname.len := r + 4;
  175.  
  176.             if (not opentfmfile) then
  177.           begin
  178.             complain (ERRREALBAD);
  179.                 writestrng(tfmname,true);
  180.         writeln(logfile,'---not loaded, TFM file can''t be opened!');
  181.         writestrng(tfmname, false);
  182.         writeln(' cannot be opened. Aborting.');
  183.         jumpout;
  184.              end
  185.             else 
  186.               begin
  187.                 if (q <= 0) or (q >= TWO27) then 
  188.           begin
  189.             complain (ERRREALBAD);
  190.                     writestrng(tfmname,true);
  191.                     writeln(logfile,'---not loaded, bad scale (', q: 1, ')!');
  192.           end
  193.                 else if (d <= 0) or (d >= TWO27) then 
  194.           begin
  195.             complain (ERRREALBAD);
  196.                     writestrng(tfmname,true);
  197.                     writeln(logfile,'---not loaded, bad design size (', d: 1, ')!');
  198.           end
  199.                 else
  200.                   if inTFM(q) then
  201.                     begin (* intfm *)
  202.                     font[nf].space := q div 6;
  203.                     if (c <> 0) and (tfmchecksum <> 0) and (c <> tfmchecksum) then 
  204.                       begin
  205.                       writeln(logfile,'Problem in fig#',pgfigurenum:0,' on page ',currpagenum:0);
  206.                   writestrng(tfmname,true);
  207.                       writeln(logfile,'---beware: check sums do not agree!');
  208.                       writeln(logfile,'   (', c: 1, ' vs. ', tfmchecksum: 1, ')');
  209.                       end;
  210.                     d := round(100.0 * conv * q / (trueconv * d));
  211.                     nf := nf + 1;
  212.                     font[nf].space := 0;
  213.                     end (* intfm *)
  214.                  end;
  215.             end;
  216.     end;
  217.  
  218. {-----------------------------------------------------}
  219.     function firstpar (o: OctByt): integer;
  220.     var fpar : integer;
  221.     begin
  222.        case (o) of
  223.             0, 1, 2, 3, 4, 5, 6,
  224.             7, 8, 9, 10, 11, 12, 13,
  225.             14, 15, 16, 17, 18, 19, 20,
  226.             21, 22, 23, 24, 25, 26, 27,
  227.             28, 29, 30, 31, 32, 33, 34,
  228.             35, 36, 37, 38, 39, 40, 41,
  229.             42, 43, 44, 45, 46, 47, 48,
  230.             49, 50, 51, 52, 53, 54, 55,
  231.             56, 57, 58, 59, 60, 61, 62,
  232.             63, 64, 65, 66, 67, 68, 69,
  233.             70, 71, 72, 73, 74, 75, 76,
  234.             77, 78, 79, 80, 81, 82, 83,
  235.             84, 85, 86, 87, 88, 89, 90,
  236.             91, 92, 93, 94, 95, 96, 97,
  237.             98, 99, 100, 101, 102, 103, 104,
  238.             105, 106, 107, 108, 109, 110, 111,
  239.             112, 113, 114, 115, 116, 117, 118,
  240.             119, 120, 121, 122, 123, 124, 125,
  241.             126, 127:
  242.                 fpar := o - 0;
  243.             128, 133, 235, 239, 243:
  244.                 fpar := Dget1byte;
  245.             129, 134, 236, 240, 244:
  246.                 fpar := Dget2byte;
  247.             130, 135, 237, 241, 245:
  248.                 fpar := Dget3byte;
  249.             143, 148, 153, 157, 162, 167:
  250.                 fpar := Dsign1byte;
  251.             144, 149, 154, 158, 163, 168:
  252.                 fpar := Dsign2byte;
  253.             145, 150, 155, 159, 164, 169:
  254.                 fpar := Dsign3byte;
  255.             131, 132, 136, 137, 146, 151, 156,
  256.             160, 165, 170, 238, 242, 246:
  257.                 fpar := Dsign4byte;
  258.             138, 139, 140, 141, 142, 247, 248,
  259.             249, 250, 251, 252, 253, 254, 255:
  260.                 fpar := 0;
  261.             147:
  262.                 fpar := w;
  263.             152:
  264.                 fpar := x;
  265.             161:
  266.                 fpar := y;
  267.             166:
  268.                 fpar := z;
  269.             171, 172, 173, 174, 175, 176, 177,
  270.             178, 179, 180, 181, 182, 183, 184,
  271.             185, 186, 187, 188, 189, 190, 191,
  272.             192, 193, 194, 195, 196, 197, 198,
  273.             199, 200, 201, 202, 203, 204, 205,
  274.             206, 207, 208, 209, 210, 211, 212,
  275.             213, 214, 215, 216, 217, 218, 219,
  276.             220, 221, 222, 223, 224, 225, 226,
  277.             227, 228, 229, 230, 231, 232, 233,
  278.             234:
  279.                 fpar := o - 171
  280.         end;
  281.         firstpar := fpar;
  282.     end;
  283.  
  284. {-----------------------------------------------------}
  285.     function specialcases (o: OctByt; p: integer): boolean;
  286.     label
  287.         46, 44, 30, 9998;
  288.     var
  289.         pure: boolean;
  290.  
  291.     begin
  292.         pure := true;
  293.         if ((o < 157) or (o > 249)) then
  294.           begin
  295.         complain (ERRREALBAD);
  296.             writeln(logfile, 'undefined command ', o: 1, '!');
  297.             goto 30;
  298.           end;
  299.         case (o) of 
  300.             157, 158, 159, 160:
  301.                 begin
  302.                     goto 44;
  303.                 end;
  304.             161, 162, 163, 164, 165:
  305.                 begin
  306.                     y := p;
  307.                     goto 44;
  308.                 end;
  309.             166, 167, 168, 169, 170:
  310.                 begin
  311.                     z := p;
  312.                     goto 44;
  313.                 end; 
  314.             171, 172, 173, 174, 175, 176, 177,
  315.             178, 179, 180, 181, 182, 183, 184,
  316.             185, 186, 187, 188, 189, 190, 191,
  317.             192, 193, 194, 195, 196, 197, 198,
  318.             199, 200, 201, 202, 203, 204, 205,
  319.             206, 207, 208, 209, 210, 211, 212,
  320.             213, 214, 215, 216, 217, 218, 219,
  321.             220, 221, 222, 223, 224, 225, 226,
  322.             227, 228, 229, 230, 231, 232, 233,
  323.             234:
  324.                 begin
  325.                     goto 46;
  326.                 end;
  327.             235, 236, 237, 238:
  328.                 begin
  329.                     goto 46;
  330.                 end;
  331.             243, 244, 245, 246:
  332.                 begin
  333.                     definefont(p);
  334.                     goto 30;
  335.                 end;
  336.  
  337.             239, 240, 241, 242:
  338.                 begin   (* =========specials============= *)
  339.                   mainhandlespecials (o, p);
  340.                   goto 30;
  341.                 end; 
  342.             247:
  343.                 begin
  344.           complain (ERRREALBAD);
  345.                   writeln(logfile,'preamble command within a page!');
  346.                   goto 9998;
  347.                 end;
  348.             248, 249:
  349.                 begin
  350.           complain (ERRREALBAD);
  351.                   writeln(logfile,'postamble command within a page!');
  352.                   goto 9998;
  353.                 end;
  354.        (*     others:
  355.                 begin
  356.                   write(' ', 'undefined command ', o: 1, '!');
  357.                   goto 30;
  358.                 end   
  359.     *)
  360.         end;
  361. 44:  (* label *)
  362.         if (v > 0) and (p > 0) then 
  363.             if (v > TWO31 - p) then 
  364.             begin
  365.                 p := TWO31 - v
  366.             end;
  367.         if (v < 0) and (p < 0) then 
  368.             if ((-v) > (p + TWO31)) then 
  369.             begin
  370.                 p := -v - TWO31
  371.             end;
  372.  
  373.         v := v + p;
  374.  
  375.         goto 30;
  376. 46:  (* label *)
  377.         font[nf].num := p;
  378.         curfont := 0;
  379.         while font[curfont].num <> p do 
  380.             curfont := curfont + 1;
  381.         goto 30 ;
  382. 9998:
  383.         pure := false;
  384. 30:
  385.         specialcases := pure;
  386.     end; 
  387.  
  388.  
  389. {-----------------------------------------------------}
  390.     function dopage : boolean;
  391.     label
  392.         41, 42, 43, 30, 9998, 9999;
  393.     var
  394.         o: OctByt;
  395.         p, q: integer;
  396.  
  397.     begin
  398.         curfont := nf;
  399.      s := 0;
  400.         h := 0;
  401.         v := 0;
  402.         w := 0;
  403.         x := 0;
  404.         y := 0;
  405.         z := 0;
  406.       
  407.         ourxpos := 0;
  408.     ourypos := 0;
  409.     ourfontnum := (-1);
  410.         while true do 
  411.           begin 
  412.             o := Dget1byte;
  413.             p := firstpar(o);
  414.             if eof(dvifile) then begin
  415.                 writeln(logfile, 'Bad DVI file: ', 'the file ended prematurely', '!');
  416.                 writeln('Bad DVI file: ', 'the file ended prematurely', '!');
  417.                 jumpout
  418.             end; 
  419.             if o <= 131 then 
  420.               begin 
  421.                 goto 41;
  422.               end
  423.             else
  424.               begin
  425.                if (o > 156) then
  426.                  begin
  427.                    if specialcases(o, p) then 
  428.                       goto 30
  429.                    else 
  430.                       goto 9998;
  431.                  end;
  432.                                          
  433.                 case (o) of
  434.                     133, 134, 135, 136:
  435.                         begin
  436.                           goto 41;
  437.                         end;
  438.                     132, 137:
  439.                         begin
  440.                             goto 42
  441.                         end;
  442.                     138:
  443.                         begin
  444.                             goto 30;
  445.                         end;
  446.                     139:
  447.                         begin (* BOP *)
  448.               complain (ERRREALBAD);
  449.                           writeln(logfile, 'bop occurred before eop');
  450.                           goto 9998; (* Fail *)
  451.                         end;
  452.                     140:
  453.                         begin (* EOP *)
  454.                             if (s <> 0) then 
  455.                   begin
  456.                   complain (ERRREALBAD);
  457.                               writeln(logfile, 'stack not empty at end of page (level ', s: 1, ')!');
  458.                   end;
  459.                 if (multifigure <> 0) then
  460.                   begin
  461.                     complain (ERRBAD);
  462.                     writeln(logfile,'Some figure definition not closed at end of page ', currpagenum:0,'!');
  463.                   end;
  464.                                    
  465.                             write (currpagenum:0,']'); 
  466.                             write (logfile,currpagenum:0,']'); 
  467.                 if ((currpagenum mod 10) = 0) then
  468.                   writeln;
  469.                             dopage := true;
  470.                             goto 9999;
  471.                         end;
  472.                     141:
  473.                         begin (* PUSH *)
  474.                           with stack[s] do 
  475.                             begin
  476.                             sh := h;
  477.                             sv := v;
  478.                             sw := w;
  479.                             sx := x;
  480.                             sy := y;
  481.                             sz := z;
  482.                             end; (* with *)
  483.                           s := s + 1;
  484.                           goto 30;
  485.                         end;
  486.                     142:
  487.                         begin (* POP *)
  488.                             if s = 0 then 
  489.                   begin
  490.                   complain (ERRREALBAD);
  491.                               writeln(logfile,'illegal pop at level zero!');
  492.                   end
  493.                             else 
  494.                   begin
  495.                                 s := s - 1;
  496.                                 with stack[s] do
  497.                                   begin
  498.                                   h := sh;
  499.                                   v := sv;
  500.                                   w := sw;
  501.                                   x := sx;
  502.                                   y := sy;
  503.                                   z := sz;
  504.                                   end;
  505.                                end;
  506.                             goto 30;
  507.                         end; 
  508.                     143, 144, 145, 146:
  509.                         begin
  510.                             q := p;
  511.                             goto 43
  512.                         end;
  513.                     147, 148, 149, 150, 151:
  514.                         begin
  515.                             w := p;
  516.                             q := p;
  517.                             goto 43
  518.                         end;
  519.                     152, 153, 154, 155, 156:
  520.                         begin
  521.                             x := p;
  522.                             q := p;
  523.                             goto 43
  524.                         end; 
  525.                 (*    others:
  526.                         if specialcases(o, p) then 
  527.                             goto 30
  528.                         else 
  529.                             goto 9998;
  530.                                 *)                          
  531.                 end; (* case *)
  532.             end; (* else *)
  533. 41:   (* finish cmd to set/put a char *)
  534.             if p < 0 then 
  535.                 p := 255 - (-1 - p) mod 256
  536.             else if p >= 256 then 
  537.                 p := p mod 256;
  538.             if (p < font[curfont].bc) or (p > font[curfont].ec) then 
  539.                 q := TWO31
  540.             else 
  541.                 q := font[curfont].widths[p];
  542.             if (q = TWO31) then 
  543.               begin
  544.             complain (ERRREALBAD);
  545.                 writeln(logfile,'Character ', p:1,' invalid in font #',curfont:0);
  546.               end;
  547.             if o >= 133 then 
  548.                 goto 30;
  549.             if q = TWO31 then 
  550.                 q := 0;
  551.             goto 43;
  552.  
  553. 42:  (* finish cmd to set/put rule *)
  554.             q := Dsign4byte;
  555.             if o = 137 then 
  556.                 goto 30;
  557.             goto 43 ;
  558.  
  559. 43:  (*finish cmd that sets h += q *)
  560.             if (h > 0) and (q > 0) then 
  561.                 if (h > (TWO31 - q)) then 
  562.                   begin
  563.                     q := TWO31 - h
  564.                   end;
  565.             if (h < 0) and (q < 0) then 
  566.                 if ((-h) > (q + TWO31)) then 
  567.                   begin
  568.                     q := (-h) - TWO31
  569.                   end;
  570.  
  571.             h := h + q;
  572. 30:
  573.         end;
  574. 9998:
  575.         dopage := false;
  576. 9999:
  577.  
  578.     end; 
  579.  
  580. {-----------------------------------------------------}
  581.     procedure skippages;
  582.     label
  583.         9999;
  584.     var
  585.         p: integer;
  586.         k: 0..255;
  587.         downthedrain: integer;
  588.     begin
  589.         while true do 
  590.           begin
  591.             if eof(dvifile) then 
  592.               begin
  593.                 writeln(logfile, 'Bad DVI file: ', 'the file ended prematurely', '!');
  594.                 write(' ', 'Bad DVI file: ', 'the file ended prematurely', '!');
  595.                 jumpout
  596.               end;
  597.             k := Dget1byte;
  598.             p := firstpar(k);
  599.             case (k) of
  600.                 139:
  601.                     begin (* BOP *)
  602.                         newbackptr := DVIMark + TotBytesWritten - 1;
  603.             currpagenum := Dsign4byte; (* count[0] *)
  604.                         for k := 1 to 9 do 
  605.                             waste := Dsign4byte; (* WAS count[k] := *)
  606.                         downthedrain := Dsign4byte;
  607.                         BackupInBuf (4);
  608.                         cmdSigned (oldbackptr, 4);
  609.                         oldbackptr := newbackptr;
  610.                         write(' ['); 
  611.                         write(logfile,' ['); 
  612.                         goto 9999;
  613.                     end;
  614.                 132, 137: (* RULE *)
  615.                     downthedrain := Dsign4byte;
  616.                 243, 244, 245, 246:
  617.                     begin
  618.                         definefont(p);
  619.                     end;
  620.                 239, 240, 241, 242: (* specials *)
  621.                     begin
  622.                         mainhandlespecials (k, p);
  623.                     end;
  624.                 248:
  625.                     begin (* POST *)
  626.                         ourq := DVIMark + TotBytesWritten - 1;
  627.                         inpostamble := true;
  628.                         goto 9999
  629.                     end;
  630.               (*  others:
  631.                     null
  632.         *)
  633.             end
  634.         end;
  635.     9999:
  636.  
  637.     end; 
  638.  
  639. {-----------------------------------------------------}
  640.     procedure readpostamble;
  641.     var
  642.         k: integer;
  643.         p, q, m: integer;
  644.         indx : integer;
  645.     begin
  646.         if (Dsign4byte <> numerator) then 
  647.             writeln(logfile,'Postamble',' numerator',' doesn''t match the preamble!');
  648.         if (Dsign4byte <> denominator) then 
  649.             writeln(logfile,'Postamble',' denominator',' doesn''t match the preamble!');
  650.         if (Dsign4byte <> mag) then 
  651.            begin
  652.            writeln(logfile,'Postamble',' magnification',' doesn''t match the preamble!');
  653.            end;
  654.         maxv := Dsign4byte;
  655.         maxh := Dsign4byte;
  656.         maxs := Dget2byte;
  657.         BackupInBuf (2);
  658.         cmd2byte (maxs + 2); (* pretend the stack depth 
  659.                   * does not increase by
  660.                   * more than two
  661.                   *)
  662.         
  663.         totalpages := Dget2byte;
  664.         repeat
  665.             k := Dget1byte;
  666.             if (k >= 243) and (k < 247) then 
  667.               begin
  668.                 p := firstpar(k);
  669.                 Fastdefinefont(p);
  670.                 k := 138;
  671.               end
  672.         until k <> 138; (* NOP *)
  673.  
  674.        (* here, backup 1, enter all our fonts and 
  675.         then output the 249 that we backed over *)
  676.         BackupInBuf (1);
  677.         for indx := 1 to MFontsDefd do
  678.           begin
  679.           with MFontTable[indx]^ do 
  680.             enterfont (DVIFontNum, Cksum, DesSize,
  681.                        DesSize, FontName );
  682.           end; (* for *)
  683.         for indx := 1 to VFontsDefd do
  684.           begin
  685.           with VFontTable[indx]^ do
  686.             enterfont (DVIFontNum, Cksum, DesSize,
  687.                         DesSize, FontName);
  688.           end;  (* for *)
  689.     for indx := 1 to LFontsDefd do
  690.       begin
  691.       with LFontTable[indx]^ do
  692.         enterfont (DVIFontNum, Cksum, DesSize,
  693.                 DesSize, FontName);    
  694.       end;
  695.         cmd1byte(249);  (* post post *)
  696.  
  697.         if (k <> 249) then 
  698.             writeln(logfile,'byte ',k:0,' is not postpost!');
  699.         q := Dsign4byte;
  700.         BackupInBuf (4);
  701.         cmd4byte (ourq);
  702.         m := Dget1byte;
  703.         if (m <> 2) then 
  704.             writeln(logfile,'identification should be ', 2: 1, '!');
  705.         m := 223;
  706.         while (m = 223) and not eof(dvifile) do 
  707.             m := Dget1byte;
  708.         if not eof(dvifile) then 
  709.     begin
  710.             writeln(' ', 'Bad DVI file: ', 'signature in should be 223', '!');
  711.             writeln(logfile, 'Bad DVI file: ', 'signature in should be 223', '!');
  712.             jumpout
  713.         end;
  714.     end;
  715.  
  716.  
  717. (* MAIN MAIN MAIN MAIN MAIN MAIN MAIN MAIN MAIN MAIN MAIN MAIN MAIN *)
  718. begin (* main *)
  719.     initialize;
  720.     AskandOpenFiles;  (* ask for filenames of inputdvi and outputfil *)
  721.  
  722.     writeln(logfile, TylVersion,' for Berkeley Unix');    
  723.  
  724.     write(logfile,'Reading File: ');
  725.     writestrng(dvifname,true);     
  726.     writeln(logfile);
  727.  
  728.  
  729.     p := Dget1byte;
  730.     if (p <> 247) then 
  731.     begin
  732.         write(' ', 'Bad DVI file: ', 'First byte isn''t start of preamble!', '!');
  733.         writeln(logfile,'Bad DVI file: ', 'First byte isn''t start of preamble!', '!');
  734.         jumpout
  735.     end;
  736.     p := Dget1byte;
  737.     if (p <> 2) then 
  738.         writeln(logfile,'identification in byte 1 should be ', 2: 1, '!');
  739.     numerator := Dsign4byte;
  740.     denominator := Dsign4byte;
  741.     if (numerator <= 0) then 
  742.     begin
  743.         write(' ', 'Bad DVI file: ', 'numerator is ', numerator: 1, '!');
  744.         writeln(logfile, 'Bad DVI file: ', 'numerator is ', numerator: 1, '!');    
  745.         jumpout
  746.     end;
  747.     if (denominator <= 0) then 
  748.     begin
  749.         write(' ', 'Bad DVI file: ', 'denominator is ', denominator: 1, '!');
  750.         writeln(logfile, 'Bad DVI file: ', 'denominator is ', denominator: 1, '!');
  751.         jumpout
  752.     end;
  753.     conv := numerator / 254000.0 * (resolution / denominator);
  754.     mag := Dsign4byte;
  755.     if (mag <= 0) then 
  756.     begin
  757.         write(' ', 'Bad DVI file: ', 'magnification is ', mag: 1, '!');
  758.         writeln(logfile, 'Bad DVI file: ', 'magnification is ', mag: 1, '!');
  759.         jumpout
  760.     end;
  761.     magfactor := mag / 1000.0;
  762.     trueconv := conv;
  763.     conv := trueconv * magfactor;
  764.     p := Dget1byte;     (* the 'k' of the preamble *)
  765.     while p > 0 do 
  766.     begin
  767.         p := p - 1;
  768.         waste := Dget1byte;
  769.     end;
  770.  
  771.     skippages;
  772.     if not inpostamble then 
  773.     begin 
  774.         while (maxpages > 0) do 
  775.           begin (* while *)
  776.             maxpages := maxpages - 1;
  777.             if (not dopage) then 
  778.               begin
  779.                 write(' ', 'Bad DVI file: ', 'page ended unexpectedly', '!');
  780.                 writeln(logfile, 'Bad DVI file: ', 'page ended unexpectedly', '!');
  781.                 jumpout
  782.               end;
  783.         (* now we are at an EOP ---end of page *)
  784.         (*  flushout GDVIbuffer, and reset counters *)
  785. {         writeln('EOP: bytes used= ',GDVIBuf.TotByteLen:0);  }
  786.             WriteDVIBuf;
  787.             ClearDVIBuf;
  788.             multifigure := 0;
  789.         pgfigurenum := 0;
  790.             FTBDs := 0;
  791.             didnewfonts := false;
  792.             repeat
  793.                 k := Dget1byte;
  794.                 if (k >= 243) and (k < 247) then  
  795.                   begin (* fontdefs *)
  796.                     p := firstpar(k);
  797.                     definefont(p);
  798.                     k := 138
  799.                   end;
  800.             until (k <> 138); (* nop *)
  801.  
  802.             if (k = 248) then 
  803.             begin
  804.                 inpostamble := true;
  805.                 ourq := DVIMark + TotBytesWritten - 1;
  806.                 goto 30
  807.             end;
  808.  
  809.             if (k = 139) then  (* BOP *)
  810.             begin
  811.         newbackptr := DVIMark + TotBytesWritten - 1;
  812.         currpagenum := Dsign4byte; (* Count[0] *)
  813.         for k := 1 to 9 do 
  814.             waste := Dsign4byte; (* WAS count[k] := *)
  815.         waste := Dsign4byte; (* backpointer *)
  816.         BackupInBuf (4);
  817.         cmdSigned (oldbackptr, 4);
  818.         oldbackptr := newbackptr;
  819.         write(' ['); 
  820.         write(logfile,' ['); 
  821.           end
  822.         else
  823.               begin (* NOT bop?? *)
  824.         writeln('We did not find BOP when expected');
  825.         writeln(logfile,'We did not find BOP when expected');
  826.                 jumpout;
  827.               end;
  828.  
  829.         end; (* while *)
  830. 30: 
  831.     end; (* if not inpostamble *)
  832.     if (not inpostamble) then 
  833.     skippages;
  834.     waste := Dsign4byte; (* ptr to the last bop in file *)
  835.     BackupInBuf (4);
  836.     cmdSigned (oldbackptr, 4);
  837.     readpostamble;
  838.     WriteDVIBuf;
  839.  
  840.     while ((TotBytesWritten mod 4) <> 0) do
  841.        OutputByte(223);  (* final signatures *)
  842.  
  843.     writeln;
  844.     writeln(logfile);
  845.     write ('Output written on '); 
  846.     writestrng(outname, false); 
  847.     write(' (',currpagenum:0,' page');
  848.     if (currpagenum > 1) then
  849.       write('s');
  850.     writeln(', ',TotBytesWritten:0,' bytes).');
  851.  
  852.     write (logfile,'Output written on ');
  853.     writestrng(outname, true); 
  854.     write(logfile,' (',currpagenum:0,' page');
  855.     if (currpagenum > 1) then
  856.       write(logfile,'s');
  857.     writeln(logfile,', ',TotBytesWritten:0,' bytes).');
  858.  
  859.     write ('Log written on ');
  860.     writestrng(logfilnam, false); writeln;
  861.     write (logfile,'Log written on '); 
  862.     writestrng(logfilnam, true); writeln (logfile);
  863.     writeln;
  864.     writeln(logfile);
  865. 666:
  866.     if (ErrorOccurred) then
  867.       begin
  868.         writeln;
  869.         writeln('Some error(s) occurred. Please check Logfile for details');
  870.         writeln('Assume that the outputfile is incorrect');
  871.       end;
  872. end. 
  873.  
  874.